package com.gts.sofa.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

public class DynamicProxyFactory {

    //维护一个 被代理类 对象 用 Object 就可以了因为不知道 被代理类是那样的。 通过 构造器 初始化 属性
    private static   Object target;
    // 利用构造器对 代理对象 进行初始化
    public DynamicProxyFactory(Object target) {
        this.target = target;
    }


    //给目标对象生成一个代理对象

    /**三个参数的说明：
     *     classLoder 代理类使用的类加载器和 被代理类使用的是一样的 加载器
     *     interfaces[]  和被代理类实现了共同的接口
     *     handler 调用处理器    实现了 InvocationHandler 这个接口的匿名实现类。重写方法
     *     这个方法里面利用反射 调用 被代理类的方法。
     *
     *
     */

     //代理对象和被代理对象的关系

    /**
     *
     *
     *
     *  代理类和被代理类 都实现了同一个接口，这个是他们俩能产生关联的唯一地方。
     *
     *  public static Object getProxyInstance() 这个是一个proxy类，和 被代理类不是同一个类型
     *
     *  缺点：如果被代理类没有实现任何接口则没有办法创建被代理类
     *
     */



    public static Object getProxyInstance(){
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("JDK代理开始了");

                System.out.println(method.getName()+"方法开始执行了参数是"+ Arrays.asList(args));
                Object  val = null;
                try{
                    val = method.invoke(target,args);
                }catch (Exception e){
                    System.out.println(method.getName()+"方法执行出现了异常"+ Arrays.asList(args));

                }

                System.out.println(method.getName()+"方法执行完了结果是"+ val);
                return val;
            }
        });
    }
}
